'''
怎么使用异步调用方式，但同时避免耦合的问题？
(1)进程池：异步 + 回调函数，，cpu密集型，同时执行，每个进程有不同的解释器和内存空间，互不干扰
'''

# 引入依赖
from concurrent.futures import ProcessPoolExecutor
import time, os
import requests


def get(url):
    print('%s GET %s' % (os.getpid(), url))
    time.sleep(3)
    response = requests.get(url)
    if response.status_code == 200:
        res = response.text
    else:
        res = '下载失败'
    return res


def parse(future):
    time.sleep(1)
    # 传入的是个对象，获取返回值 需要进行result操作
    res = future.result()
    print("res", )
    print('%s 解析结果为%s' % (os.getpid(), len(res)))


if __name__ == '__main__':
    urls = [
        'https://www.baidu.com',
        'https://www.sina.com.cn',
        'https://www.tmall.com',
        'https://www.jd.com',
        'https://www.python.org',
        'https://www.openstack.org',
        'https://www.baidu.com',
        'https://www.baidu.com',
        'https://www.baidu.com',
    ]
    p = ProcessPoolExecutor(9)
    start = time.time()
    for url in urls:
        future = p.submit(get, url)
        # 模块内的回调函数方法，parse会使用future对象的返回值，对象返回值是执行任务的返回值
        # 回调应该是相当于parse(future)
        future.add_done_callback(parse)
    p.shutdown(wait=True)
    print("完成时间", time.time() - start)  # 完成时间 33.79998469352722
